Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

core/repository/src/commonTest/kotlin/org/meshtastic/core/repository/usecase/SendMessageUseCaseTest.kt 4f86b91973784e4ec05b9a5c7b2dc396ed4848b8 (4f86b919) Text, 8.70 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.repository.usecase

Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787dev.mokkery.verify
Tff7b72import T7ee787io.kotest.matchers.shouldBe
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.NodeAddress
Tff7b72import T7ee787org.meshtastic.core.repository.MessageQueue
Tff7b72import T7ee787org.meshtastic.core.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.repository.PlatformAnalytics
Tff7b72import T7ee787org.meshtastic.core.testing.FakeAppPreferences
Tff7b72import T7ee787org.meshtastic.core.testing.FakeNodeRepository
Tff7b72import T7ee787org.meshtastic.core.testing.FakeRadioController
Tff7b72import T7ee787org.meshtastic.proto.Config
Tff7b72import T7ee787org.meshtastic.proto.DeviceMetadata
Tff7b72import T7ee787org.meshtastic.proto.User
Tff7b72import T7ee787kotlin.test.BeforeTest
Tff7b72import T7ee787kotlin.test.Test

Tff7b72class T56d364SendMessageUseCaseTest Tb4b4b4{

Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3nodeRepositoryTb4b4b4: Te6edf3FakeNodeRepository
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepository
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3radioControllerTb4b4b4: Te6edf3FakeRadioController
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3appPreferencesTb4b4b4: Te6edf3FakeAppPreferences
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3messageQueueTb4b4b4: Te6edf3MessageQueue
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3analyticsTb4b4b4: Te6edf3PlatformAnalytics
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3useCaseTb4b4b4: Te6edf3SendMessageUseCase

Tf0883e@BeforeTest
Tff7b72fun Td2a8ffsetUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3nodeRepository Tff7b72= Te6edf3FakeNodeRepositoryTb4b4b4(Tb4b4b4)
Te6edf3packetRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Te6edf3radioController Tff7b72= Te6edf3FakeRadioControllerTb4b4b4(Tb4b4b4)
Te6edf3appPreferences Tff7b72= Te6edf3FakeAppPreferencesTb4b4b4(Tb4b4b4)
Te6edf3messageQueue Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Te6edf3analytics Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)

Te6edf3useCase Tff7b72=
Te6edf3SendMessageUseCaseImplTb4b4b4(
Te6edf3nodeRepository Tff7b72= Te6edf3nodeRepositoryTb4b4b4,
Te6edf3packetRepository Tff7b72= Te6edf3packetRepositoryTb4b4b4,
Te6edf3radioController Tff7b72= Te6edf3radioControllerTb4b4b4,
Te6edf3homoglyphEncodingPrefs Tff7b72= Te6edf3appPreferencesTb4b4b4.Te6edf3homoglyphTb4b4b4,
Te6edf3messageQueue Tff7b72= Te6edf3messageQueueTb4b4b4,
Te6edf3analytics Tff7b72= Te6edf3analyticsTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`invoke with broadcast message simply sends data packet`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Arrange
Tff7b72val Te6edf3ourNode Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!1234Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setOurNodeTb4b4b4(Te6edf3ourNodeTb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3homoglyphTb4b4b4.Te6edf3setHomoglyphEncodingEnabledTb4b4b4(Tff7b72falseTb4b4b4)

T8b949e// Act
Te6edf3useCaseTb4b4b4(Ta5d6ff"Ta5d6ffHello broadcastTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff0Tffd700${Te6edf3NodeAddressTb4b4b4.Te6edf3ID_BROADCASTTffd700}Ta5d6ff"Tb4b4b4, Tff7b72nullTb4b4b4)

T8b949e// Assert
Te6edf3radioControllerTb4b4b4.Te6edf3favoritedNodesTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff0
Te6edf3radioControllerTb4b4b4.Te6edf3sentSharedContactsTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff0
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`invoke reports a message_send analytics action`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Arrange
Tff7b72val Te6edf3ourNode Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!1234Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setOurNodeTb4b4b4(Te6edf3ourNodeTb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3homoglyphTb4b4b4.Te6edf3setHomoglyphEncodingEnabledTb4b4b4(Tff7b72falseTb4b4b4)

T8b949e// Act
Te6edf3useCaseTb4b4b4(Ta5d6ff"Ta5d6ffHelloTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff0Tffd700${Te6edf3NodeAddressTb4b4b4.Te6edf3ID_BROADCASTTffd700}Ta5d6ff"Tb4b4b4, Tff7b72nullTb4b4b4)

T8b949e// Assert
Te6edf3verify Tb4b4b4{ Te6edf3analyticsTb4b4b4.Te6edf3trackActionTb4b4b4(Ta5d6ff"Ta5d6ffmessage_sendTa5d6ff"Tb4b4b4, Te6edf3mapOfTb4b4b4(Ta5d6ff"Ta5d6ffnum_bytesTa5d6ff" Te6edf3to T79c0ff5Tb4b4b4, Ta5d6ff"Ta5d6ffis_replyTa5d6ff" Te6edf3to Tff7b72falseTb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`invoke with direct message to older firmware triggers favoriteNode`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Arrange
Tff7b72val Te6edf3ourNode Tff7b72=
Te6edf3NodeTb4b4b4(
Te6edf3num Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!localTa5d6ff"Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DeviceConfigTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3CLIENTTb4b4b4)Tb4b4b4,
Te6edf3metadata Tff7b72= Te6edf3DeviceMetadataTb4b4b4(Te6edf3firmware_version Tff7b72= Ta5d6ff"Ta5d6ff2.0.0Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setOurNodeTb4b4b4(Te6edf3ourNodeTb4b4b4)

Tff7b72val Te6edf3destNode Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4T79c0ff5Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!destTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3upsertTb4b4b4(Te6edf3destNodeTb4b4b4)

Te6edf3appPreferencesTb4b4b4.Te6edf3homoglyphTb4b4b4.Te6edf3setHomoglyphEncodingEnabledTb4b4b4(Tff7b72falseTb4b4b4)

T8b949e// Act
Te6edf3useCaseTb4b4b4(Ta5d6ff"Ta5d6ffDirect messageTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff!destTa5d6ff"Tb4b4b4, Tff7b72nullTb4b4b4)

T8b949e// Assert
Te6edf3radioControllerTb4b4b4.Te6edf3favoritedNodesTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff1
Te6edf3radioControllerTb4b4b4.Te6edf3favoritedNodesTff7b72[T79c0ff0Tff7b72] Te6edf3shouldBe T79c0ff1T79c0ff2T79c0ff3T79c0ff4T79c0ff5
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`invoke with direct message to new firmware triggers sendSharedContact`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Arrange
Tff7b72val Te6edf3ourNode Tff7b72=
Te6edf3NodeTb4b4b4(
Te6edf3num Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!localTa5d6ff"Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DeviceConfigTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3CLIENTTb4b4b4)Tb4b4b4,
Te6edf3metadata Tff7b72= Te6edf3DeviceMetadataTb4b4b4(Te6edf3firmware_version Tff7b72= Ta5d6ff"Ta5d6ff2.7.12Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setOurNodeTb4b4b4(Te6edf3ourNodeTb4b4b4)

Tff7b72val Te6edf3destNode Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff6T79c0ff7T79c0ff8T79c0ff9T79c0ff0Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!destTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3upsertTb4b4b4(Te6edf3destNodeTb4b4b4)

Te6edf3appPreferencesTb4b4b4.Te6edf3homoglyphTb4b4b4.Te6edf3setHomoglyphEncodingEnabledTb4b4b4(Tff7b72falseTb4b4b4)

T8b949e// Act
Te6edf3useCaseTb4b4b4(Ta5d6ff"Ta5d6ffDirect messageTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff!destTa5d6ff"Tb4b4b4, Tff7b72nullTb4b4b4)

T8b949e// Assert
Te6edf3radioControllerTb4b4b4.Te6edf3sentSharedContactsTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff1
Te6edf3radioControllerTb4b4b4.Te6edf3sentSharedContactsTff7b72[T79c0ff0Tff7b72] Te6edf3shouldBe T79c0ff6T79c0ff7T79c0ff8T79c0ff9T79c0ff0
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`invoke with homoglyph enabled transforms text`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Arrange
Tff7b72val Te6edf3ourNode Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff1Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setOurNodeTb4b4b4(Te6edf3ourNodeTb4b4b4)
Te6edf3appPreferencesTb4b4b4.Te6edf3homoglyphTb4b4b4.Te6edf3setHomoglyphEncodingEnabledTb4b4b4(Tff7b72trueTb4b4b4)

Tff7b72val Te6edf3originalText Tff7b72= Ta5d6ff"Ta5d6ff\Ta5d6ffu0410ppleTa5d6ff" T8b949e// Cyrillic A

T8b949e// Act
Te6edf3useCaseTb4b4b4(Te6edf3originalTextTb4b4b4, Ta5d6ff"Ta5d6ff0Tffd700${Te6edf3NodeAddressTb4b4b4.Te6edf3ID_BROADCASTTffd700}Ta5d6ff"Tb4b4b4, Tff7b72nullTb4b4b4)

T8b949e// Assert
T8b949e// Verified by observing that no exception is thrown and coverage is hit.
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`invoke with PKI DM triggers sendSharedContact`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Arrange: PKI DMs use contactKey = "8!nodeHex" (PKC_CHANNEL_INDEX = 8)
Tff7b72val Te6edf3ourNode Tff7b72=
Te6edf3NodeTb4b4b4(
Te6edf3num Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!localTa5d6ff"Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DeviceConfigTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3CLIENTTb4b4b4)Tb4b4b4,
Te6edf3metadata Tff7b72= Te6edf3DeviceMetadataTb4b4b4(Te6edf3firmware_version Tff7b72= Ta5d6ff"Ta5d6ff2.7.12Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setOurNodeTb4b4b4(Te6edf3ourNodeTb4b4b4)

Tff7b72val Te6edf3destNode Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff0Te6edf3x70fdde9bTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!70fdde9bTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3upsertTb4b4b4(Te6edf3destNodeTb4b4b4)

Te6edf3appPreferencesTb4b4b4.Te6edf3homoglyphTb4b4b4.Te6edf3setHomoglyphEncodingEnabledTb4b4b4(Tff7b72falseTb4b4b4)

T8b949e// Act — PKI DM: channel 8 + node ID
Te6edf3useCaseTb4b4b4(Ta5d6ff"Ta5d6ffPKI direct messageTa5d6ff"Tb4b4b4, Ta5d6ff"Tffd700${Te6edf3NodeAddressTb4b4b4.Te6edf3PKC_CHANNEL_INDEXTffd700}Ta5d6ff!70fdde9bTa5d6ff"Tb4b4b4, Tff7b72nullTb4b4b4)

T8b949e// Assert — sendSharedContact should be called for PKI DMs
Te6edf3radioControllerTb4b4b4.Te6edf3sentSharedContactsTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff1
Te6edf3radioControllerTb4b4b4.Te6edf3sentSharedContactsTff7b72[T79c0ff0Tff7b72] Te6edf3shouldBe T79c0ff0Te6edf3x70fdde9bTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Te6edf3radioControllerTb4b4b4.Te6edf3favoritedNodesTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff0
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`invoke with channel DM does not trigger sendSharedContact or favorite`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Arrange: channel-based DMs use contactKey = "<ch>!nodeHex" where ch is 0-7
Tff7b72val Te6edf3ourNode Tff7b72=
Te6edf3NodeTb4b4b4(
Te6edf3num Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!localTa5d6ff"Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DeviceConfigTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3CLIENTTb4b4b4)Tb4b4b4,
Te6edf3metadata Tff7b72= Te6edf3DeviceMetadataTb4b4b4(Te6edf3firmware_version Tff7b72= Ta5d6ff"Ta5d6ff2.7.12Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setOurNodeTb4b4b4(Te6edf3ourNodeTb4b4b4)

Tff7b72val Te6edf3destNode Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff0Te6edf3x12345678Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!12345678Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3upsertTb4b4b4(Te6edf3destNodeTb4b4b4)

Te6edf3appPreferencesTb4b4b4.Te6edf3homoglyphTb4b4b4.Te6edf3setHomoglyphEncodingEnabledTb4b4b4(Tff7b72falseTb4b4b4)

T8b949e// Act — channel 1 DM (not PKI, not legacy)
Te6edf3useCaseTb4b4b4(Ta5d6ff"Ta5d6ffChannel DMTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff1!12345678Ta5d6ff"Tb4b4b4, Tff7b72nullTb4b4b4)

T8b949e// Assert — neither sendSharedContact nor favorite should be called for channel DMs
Te6edf3radioControllerTb4b4b4.Te6edf3sentSharedContactsTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff0
Te6edf3radioControllerTb4b4b4.Te6edf3favoritedNodesTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff0
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ff`invoke with PKI DM to older firmware does not trigger favorite`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
T8b949e// Arrange: PKI DMs with old firmware should NOT fall through to favoriting
Tff7b72val Te6edf3ourNode Tff7b72=
Te6edf3NodeTb4b4b4(
Te6edf3num Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!localTa5d6ff"Tb4b4b4, Te6edf3role Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3DeviceConfigTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3CLIENTTb4b4b4)Tb4b4b4,
Te6edf3metadata Tff7b72= Te6edf3DeviceMetadataTb4b4b4(Te6edf3firmware_version Tff7b72= Ta5d6ff"Ta5d6ff2.0.0Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setOurNodeTb4b4b4(Te6edf3ourNodeTb4b4b4)

Tff7b72val Te6edf3destNode Tff7b72= Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= T79c0ff0Te6edf3xABCDEF01Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!abcdef01Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3nodeRepositoryTb4b4b4.Te6edf3upsertTb4b4b4(Te6edf3destNodeTb4b4b4)

Te6edf3appPreferencesTb4b4b4.Te6edf3homoglyphTb4b4b4.Te6edf3setHomoglyphEncodingEnabledTb4b4b4(Tff7b72falseTb4b4b4)

T8b949e// Act — PKI DM with firmware that doesn't support verified contacts
Te6edf3useCaseTb4b4b4(Ta5d6ff"Ta5d6ffOld PKI DMTa5d6ff"Tb4b4b4, Ta5d6ff"Tffd700${Te6edf3NodeAddressTb4b4b4.Te6edf3PKC_CHANNEL_INDEXTffd700}Ta5d6ff!abcdef01Ta5d6ff"Tb4b4b4, Tff7b72nullTb4b4b4)

T8b949e// Assert — PKI DMs should not trigger legacy favoriting (that's only for channel==null)
Te6edf3radioControllerTb4b4b4.Te6edf3sentSharedContactsTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff0
Te6edf3radioControllerTb4b4b4.Te6edf3favoritedNodesTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff0
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.07s